Skip to content

Add support for relaxed header value parsing#787

Open
pimterry wants to merge 1 commit intonodejs:mainfrom
httptoolkit:relaxed-header-values
Open

Add support for relaxed header value parsing#787
pimterry wants to merge 1 commit intonodejs:mainfrom
httptoolkit:relaxed-header-values

Conversation

@pimterry
Copy link
Member

This PR adds support for 'relaxed' header parsing, to support the parsing side of nodejs/node#61597. See the comments in that PR for context.

The end goal here is to build a new 3rd mode for HTTP parsing in Node, such that we have:

  • Strict mode - existing default, sticks closely to the RFCs and rejects anything else.
  • Insecure mode - existing option, primarily for backward compatibility with past Node behaviour - prints a warning on usage, allows anything, definitely dangerous.
  • Relaxed mode - new option, to widen compatibility into grey areas (e.g. matching real browser behaviour & the WHATWG Fetch spec, where they support behaviour the RFC discourages but doesn't prohibit) but still reject anything that could be considered as insecure or dangerous.

This is my first LLHTTP PR, but I think most of the implementation is relatively clear hopefully.

Naming is hard here, since this clearly fits within the 'lenient' flags, but by design it is fully distinct from the other lenient flags that are all part of Node's insecure mode. I've gone with just treating it as a new type of lenient flag (LENIENT_HEADER_VALUE_RELAXED) but open to opinions.

@pimterry
Copy link
Member Author

Build is failing before the tests, in dev env provisioning.

@pimterry
Copy link
Member Author

All the core tests here are passing. The aiohttp regression tests that fail are unrelated, and I've fixed separately in #788.

RajeshKumar11 added a commit to RajeshKumar11/node that referenced this pull request Feb 13, 2026
Add support for lenient outgoing header value validation when the
insecureHTTPParser option is set. By default, strict validation per
RFC 7230 is used (rejecting control characters except HTAB). When
insecureHTTPParser is enabled, validation follows the Fetch spec
(rejecting only NUL, CR, and LF).

This applies to setHeader(), appendHeader(), and addTrailers() on
OutgoingMessage (both ClientRequest and ServerResponse).

Also adds the kLenientHeaderValueRelaxed flag in the C++ HTTP parser
binding, wiring up llhttp's new lenient_header_value_relaxed option
for inbound parsing when insecureHTTPParser is enabled.

Note: requires llhttp update from nodejs/llhttp#787 for inbound
parsing support (kLenientHeaderValueRelaxed).

Fixes: nodejs#61582
RajeshKumar11 added a commit to RajeshKumar11/node that referenced this pull request Feb 13, 2026
Add support for lenient outgoing header value validation when the
insecureHTTPParser option is set. By default, strict validation per
RFC 7230 is used (rejecting control characters except HTAB). When
insecureHTTPParser is enabled, validation follows the Fetch spec
(rejecting only NUL, CR, and LF).

This applies to setHeader(), appendHeader(), and addTrailers() on
OutgoingMessage (both ClientRequest and ServerResponse).

The C++ parser wiring for inbound parsing (kLenientHeaderValueRelaxed)
will be added in a follow-up once the llhttp dependency is updated
with nodejs/llhttp#787.

Fixes: nodejs#61582
@pimterry
Copy link
Member Author

@nodejs/llhttp

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant